package com.java.team.service;

import com.java.team.domain.Architect;
import com.java.team.domain.Designer;
import com.java.team.domain.Employee;
import com.java.team.domain.Programmer;

public class TeamService {

    private  int counter = 1;//用来为开发团队新增成员自动生成团队中的唯一ID，即memberId。（提示：应使用增1的方式）
    private final int MAX_MEMBER = 5;//表示开发团队最大成员数
    private Programmer[] team = new Programmer[MAX_MEMBER];//用来保存当前团队中的各成员对象
    private int total;//记录团队成员的实际人数


    /**
     * 返回当前团队的所有对象
     * @return 包含所有成员对象的数组，数组大小与成员人数一致
     */
    public Programmer[] getTeam(){
        Programmer[] team = new Programmer[total];
        for (int i = 0; i < team.length; i++) {
            team[i] = this.team[i];
        }
        return team;
    }

    /**
     * 向团队中添加成员
     * @param e 待添加成员的对象
     * @throws TeamException 添加失败， TeamException中包含了失败原因
     * 	失败信息包含以下几种：
     * 成员已满，无法添加
     * 该成员不是开发人员，无法添加
     * 该员工已在本开发团队中
     * 该员工已是某团队成员
     * 该员正在休假，无法添加
     * 团队中至多只能有一名架构师
     * 团队中至多只能有两名设计师
     * 团队中至多只能有三名程序员
     */
    public void addMember(Employee e) throws TeamException{
        if(total >= MAX_MEMBER){
            throw new TeamException("成员已满，无法添加");
        }
        if(!(e instanceof Programmer)){
            throw new TeamException("该成员不是开发人员，无法添加");
        }
        for (int i = 0; i < total; i++) {
            if(team[i].getId() == e.getId()){
                throw new TeamException("该员工已在本开发团队中");
            }
        }
        Programmer p = (Programmer)e;
//        if("BUSY".equals(p.getStatus().getNAME())){
//            throw new TeamException("该员工已是某团队成员");
//        }else if("VOCATION".equals(p.getStatus().getNAME())){
//            throw new TeamException("该员正在休假，无法添加");
//        }
        Status status = p.getStatus();
        switch (status){//byte,short,int,char,String,enum
            case BUSY:
                throw new TeamException("该员工已是某团队成员");
            case VOCATION:
                throw new TeamException("该员正在休假，无法添加");
        }
        ////获取team已有成员中架构师，设计师，程序员的人数
        int programmerNum =0,designerNum =0,architectNum=0;
        for (int i = 0; i < total; i++) {
            if(team[i] instanceof Architect){
                architectNum++;
            }else if(team[i] instanceof Designer){
                designerNum++;
            }else if(team[i] instanceof Programmer){
                programmerNum++;
            }
        }
        
        if(p instanceof Architect){
            if(architectNum >= 1){
                throw new TeamException("团队中至多只能有一名架构师");
            }
        }else if(p instanceof Designer){
            if(designerNum >= 2){
                throw new TeamException("团队中至多只能有两名设计师");
            }
        }else if(p instanceof Programmer){
            if(programmerNum >= 3){
                throw new TeamException("团队中至多只能有三名程序员");
            }
        }
        //前后位置没关系
        team[total++] = p;
        p.setMemberId(counter++);
        p.setStatus(Status.BUSY);
    }

    /**
     * 从团队中删除成员
     * @param memberId 待删除成员的memberId
     * @throws TeamException 找不到指定memberId的员工，删除失败
     */
    public void removeMember(int memberId) throws TeamException{

        int i = 0;
        for (; i < total; i++) {
            if(memberId == team[i].getMemberId()){
                team[i].setStatus(Status.FREE);
                break;
            }
        }
        if(i == total) {
            throw new TeamException("找不到指定memberId的员工，删除失败");
        }
        //后一个元素覆盖前一个元素，实现删除操作
        for (int j = i; j < total-1; j++) {
            team[j] = team[j+1];
        }
        team[--total] = null;
    }
}
